package leetcode.题库.数组.普通数组;

/**
 * @author: yan
 * @description: 和为K的子数组
 * @create: 2023-02-14 17:47
 **/

/**
 * 描述：给你一个整数数组nums和一个整数k，请你统计并返回该数组中和为k的连续子数组的个数
 */

import java.util.HashMap;
import java.util.Map;

/**
 * 解法一：暴力法
 *      循环两遍
 * 解法二：前缀和+哈希表
 *      类似两数之和，这里存储前缀和
 */

public class Solution560 {
    public static void main(String[] args) {
        int[] arr = new int[]{3,4,7,2,-3,1,4,2};
        System.out.println(subarraySum(arr, 2));
    }
    public static int subarraySum(int[] nums, int k) {
        // 存储前缀和
        Map<Integer, Integer> map = new HashMap<>();
        map.put(0,1);
        int res = 0, sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            if (map.containsKey(sum - k)) {
                res += map.get(sum-k);
            }
            map.put(sum, map.getOrDefault(sum, 0) + 1);
        }
        return res;
    }
}
